package org.example.springboot.controller;

import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.example.springboot.common.Result;
import org.example.springboot.entity.Employee;
import org.example.springboot.service.EmployeeService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;

@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Resource
    private EmployeeService employeeService;

    // ===== 员工增删改查相关接口 =====

    @PostMapping("/add")
    public Result add(@RequestBody Employee employee) {
        employeeService.add(employee);
        return Result.success();
    }

    @DeleteMapping("/deleteById/{id}")
    public Result deleteById(@PathVariable Integer id) {
        employeeService.deleteById(id);
        return Result.success();
    }

    @DeleteMapping("/deleteBatch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {
        employeeService.deleteBatch(ids);
        return Result.success();
    }

    @PutMapping("/updateById")
    public Result update(@RequestBody Employee employee) {
        employeeService.updateById(employee);
        return Result.success();
    }

    @GetMapping("/selectAll")
    public Result selectAll(Employee employee) {
        List<Employee> list = employeeService.selectAll(employee);
        return Result.success(list);
    }

    @GetMapping("/selectById/{id}")
    public Result selectById(@PathVariable Integer id) {
        Employee employee = employeeService.selectById(id);
        return Result.success(employee);
    }

    @GetMapping("/selectPage")
    public Result selectPage(Employee employee,
                             @RequestParam(defaultValue = "1") Integer pageNum,
                             @RequestParam(defaultValue = "10") Integer pageSize) {
        PageInfo<Employee> pageInfo = employeeService.selectPage(employee, pageNum, pageSize);
        return Result.success(pageInfo);
    }

    // ===== 导出功能 =====

   /**
 * 导出员工信息为 Excel 文件
 *
 * @param response HttpServletResponse 用于向客户端返回 Excel 文件流
 */
    @GetMapping("/export")
    public void export(HttpServletResponse response) {
        try {
            // 1. 获取所有员工数据（不带查询条件）
            List<Employee> list = employeeService.selectAll(null);

            // 2. 创建一个 Excel 写入器对象，并设置表头别名（中英文字段映射）
            ExcelWriter writer = ExcelUtil.getWriter(true); // true 表示创建一个新的工作簿

            // 设置 Excel 列标题与 Employee 实体类字段的映射关系
            writer.addHeaderAlias("username", "账号");       // username 字段导出为“账号”
            writer.addHeaderAlias("name", "姓名");           // name 字段导出为“姓名”
            writer.addHeaderAlias("departmentName", "部门"); // departmentName 字段导出为“部门”
            writer.addHeaderAlias("sex", "性别");            // sex 字段导出为“性别”
            writer.addHeaderAlias("age", "年龄");            // age 字段导出为“年龄”
            writer.addHeaderAlias("no", "工号");             // no 字段导出为“工号”
            writer.addHeaderAlias("description", "描述");    // description 字段导出为“描述”
            writer.addHeaderAlias("role", "角色");           // role 字段导出为“角色”

            // 设置只导出设置了别名的字段，忽略其他未配置的字段
            writer.setOnlyAlias(true);

            // 3. 将获取到的员工数据写入 Excel
            writer.write(list, true); // 第二个参数为 `isWriteHead`，true 表示写入表头

            // 4. 设置 HTTP 响应头，告诉浏览器这是一个 Excel 文件下载
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");

            // 对文件名进行 URL 编码，防止中文乱码
            String fileName = URLEncoder.encode("员工信息", StandardCharsets.UTF_8);

            // 设置 Content-Disposition 头，触发浏览器下载行为
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

            // 5. 将生成的 Excel 文件内容输出到响应流，供浏览器下载
            try (ServletOutputStream outputStream = response.getOutputStream()) {
                writer.flush(outputStream); // 将数据刷新到输出流
            } finally {
                writer.close(); // 关闭 ExcelWriter，释放资源
            }
        } catch (Exception e) {
            // 异常处理：打印异常堆栈信息（实际生产环境建议使用日志框架记录）
            e.printStackTrace();
        }
    }


  /**
 * 接收上传的 Excel 文件并导入员工数据到数据库
 *
 * @param file 上传的 Excel 文件（MultipartFile）
 * @return Result 操作结果（成功或失败提示）
 * @throws Exception 抛出异常供全局异常处理器处理
 */
@PostMapping("/import")
public Result importData(MultipartFile file) throws Exception {
    // 1. 获取文件输入流
    InputStream inputStream = file.getInputStream();

    // 2. 使用 Hutool 的 ExcelUtil 创建 ExcelReader 实例
    ExcelReader reader = ExcelUtil.getReader(inputStream);

    // 3. 设置 Excel 表头与 Java 实体类字段的映射关系（别名映射）
    reader.addHeaderAlias("账号", "username");       // Excel 列名“账号”对应 Employee.username 字段
    reader.addHeaderAlias("姓名", "name");           // “姓名” -> name
    reader.addHeaderAlias("部门", "departmentName"); // “部门” -> departmentName
    reader.addHeaderAlias("性别", "sex");            // “性别” -> sex
    reader.addHeaderAlias("年龄", "age");            // “年龄” -> age
    reader.addHeaderAlias("工号", "no");             // “工号” -> no
    reader.addHeaderAlias("描述", "description");    // “描述” -> description
    reader.addHeaderAlias("角色", "role");           // “角色” -> role

    // 4. 读取 Excel 所有数据并转换为 List<Employee>
    List<Employee> employeeList = reader.readAll(Employee.class);

    // 5. 将读取到的员工数据批量插入数据库
    for (Employee employee : employeeList) {
        employeeService.add(employee); // 调用 service 层新增方法
    }

    // 6. 返回统一格式的成功响应
    return Result.success();
}

}
